package com.hugang.reflect;

import org.junit.Test;

import java.util.Random;

/**
 * 通过反射创建对应的运行时类的对象
 *
 * @author hg
 * @date 2020/6/22 22:04
 */
public class NewInstanceTest {

    @Test
    public void test1() throws IllegalAccessException, InstantiationException {
        Class<Person> p = Person.class;

        /*
            newInstance():调用此方法，创建对应的运行时类的对象，内部调用了运行时类的空参构造器
            要想此方法正常地创建运行时类的对象，要求：
            1、运行时类必须提供空参构造器
            2、空参构造器的访问权限足够，通常设置为public

            在javabean中要求提供一个public的空参构造器。原因：
            1.便于通过反射，创建运行时类的对象
            2.便于子类继承此运行时类时，默认调用super()时，保证父类有此构造器

         */
        Person person = p.newInstance();
        System.out.println(person);
    }

    @Test
    public void test2() throws Exception {
        String classPath = "";
        for (int j = 0; j < 100; j++) {
            int i = new Random().nextInt(3);//0，1，2
            System.out.println(i);
            switch (i) {
                case 0:
                    classPath = "java.util.Date";
                    break;
                case 1:
                    classPath = "com.hugang.reflect.Person";
                    break;
                case 2:
                    classPath = "java.lang.Object";
                    break;
                default:
            }
            Object instance = getInstance(classPath);
            System.out.println(instance);
        }


    }

    /**
     * 创建一个指定类的对象
     * classPath:指定类的全类名
     *
     * @param classPath
     * @return
     * @throws Exception
     */
    public Object getInstance(String classPath) throws Exception {
        return Class.forName(classPath);
    }
}
